from copy import deepcopy
from tkinter import ttk, filedialog
import pandas as pd

from utils import is_xlsx, is_xls, get_mapping_data, format_date, add_years_and_days, save_file


class Roster(ttk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        label = ttk.Label(self, text="花名册")
        label.pack(pady=10, padx=10)
        from views import MainPage

        button = ttk.Button(self, text="返回主页面",
                            command=lambda: controller.show_frame(MainPage))
        button.pack()

        load_button = ttk.Button(self, text="上传Excel文件", command=self.load_file)
        load_button.pack()

    def load_file(self):
        filepath = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx *.xls")])
        if filepath:
            deal_data(filepath)

def deal_data(filepath):
    if(is_xlsx(filepath) or is_xls(filepath)):
        xls = pd.ExcelFile(filepath)
        sheet_names = xls.sheet_names
        # 读取 base_info 表格，并获取原始顺序
        base_info_df = pd.read_excel(filepath, sheet_name=sheet_names[1])
        original_order = base_info_df['员工UserID'].tolist()
        base_info_map = get_mapping_data(filepath, sheet_names[1])
        work_info_map = get_mapping_data(filepath, sheet_names[3])
        person_info_map = get_mapping_data(filepath, sheet_names[4])
        education_info_map = get_mapping_data(filepath, sheet_names[5], 1, 'records')
        link_info_map = get_mapping_data(filepath, sheet_names[8], 1, 'records')
        table_data = []
        # 获取原始顺序
        for id in original_order:
            first_study = get_first_study(education_info_map[id])
            high_study = get_high_study(education_info_map[id])
            print(base_info_map[id]['入职时间'])
            start_date = format_date(base_info_map[id]['入职时间'])
            end_date = add_years_and_days(start_date, years=3, days=-1)

            obj = {
                '序号': list(base_info_map.keys()).index(id) + 1,
                '工号': base_info_map[id]['工号'],
                '姓名': base_info_map[id]['姓名'],
                '性别': person_info_map[id]['性别'],
                '一级部门': base_info_map[id]['1级部门'],
                '一级部门负责人': base_info_map[id]['直属主管'],
                '二级部门': base_info_map[id]['2级部门'],
                '二级部门负责人': base_info_map[id]['2级部门'] and base_info_map[id]['直属主管'] or '',
                '三级部门': base_info_map[id]['3级部门'],
                '三级部门负责人': base_info_map[id]['3级部门'] and base_info_map[id]['直属主管'] or '',
                '职位': base_info_map[id]['职位'],
                '手机号': base_info_map[id]['手机号'],
                '邮箱': base_info_map[id]['邮箱'],
                '状态': work_info_map[id]['员工类型'] == '实习' and '实习' or work_info_map[id]['员工状态'],
                '保险地': base_info_map[id]['参保地'],
                '合同开始时间': start_date,
                '合同到期时间': end_date,
                '实际转正日期': format_date(work_info_map[id]['实际转正日期']),
                '户口所在地': person_info_map[id]['身份证地址'],
                '身份证': person_info_map[id]['证件号码'],
                '出生日期': format_date(person_info_map[id]['出生日期']),
                '年龄': person_info_map[id]['年龄（系统计算）'],
                '工龄': person_info_map[id]['工龄（系统计算）'],
                '在职状态': work_info_map[id]['员工状态'] and '在职',
                '入职时间': format_date(base_info_map[id]['入职时间']),
                '司龄/月': base_info_map[id]['司龄（系统计算）'],
                '第一学历': first_study.get('学历', ''),
                '是否统招': '',
                '毕业院校': first_study.get('毕业院校', ''),
                '专业': first_study.get('所学专业', ''),
                '第一学历毕业时间': format_date(first_study.get('毕业时间', '')),
                '最高学历': high_study.get('学历', ''),
                '最高学历是否为统招': '',
                '最高学历毕业院校': high_study.get('毕业院校', ''),
                '最高学历专业': high_study.get('所学专业', ''),
                '最高学历毕业时间': format_date(high_study.get('毕业时间', '')),
                '婚否': person_info_map[id]['婚姻状况'],
                '家属姓名': link_info_map[id][0]['紧急联系人姓名'],
                '家属联系方式': link_info_map[id][0]['联系人电话'],
                '联系地址': person_info_map[id].get('住址', ''),
                '政治面貌': person_info_map[id]['政治面貌'],
                '专业技术职务': '',
                '资格证书': '',
                '离职时间': '',
                '离职原因': '',
                '招聘HR': '',
                '备注': ''
            }
            table_data.append(obj)
        # 将数据导出到Excel文件
        df = pd.DataFrame(table_data)
        df_processed = df.applymap(process_cell)
        save_file(df_processed, '花名册')
# 处理 DataFrame 数据
def process_cell(cell):
    if isinstance(cell, dict):
        values = [value for value in cell.values() if pd.notna(value)]
        if len(values) > 0:
            return values[0]
        else:
            return ''  # 如果没有有效值，返回空字符串
    return cell

def l2m(arr, key):
    """
    将列表转换为字典，键为指定的字段。
    """
    result = {}
    for item in arr:
        if key in item:
            result[item[key]] = item
    return result

study_list = ['其他', '小学', '初中', '高中', '中专', '大专', '本科', '硕士', '博士']

def get_first_study(arr):
    """
    获取第一个有效的学历。

    参数:
    - arr: 包含学历信息的列表。
    - study_list: 预定义的学历列表。

    返回:
    - 第一个有效的学历值。
    """
    if len(arr) == 1:
        return arr[0]
    elif arr:
        study_map = l2m(arr, '学历')
        for study in study_list:
            if study in study_map:
                return study_map[study]
    return None
def get_high_study(education_info):
    """
    获取最高学历。
    """
    if len(education_info) == 1:
        return education_info[0]
    else:
        study_map = l2m(education_info, '学历')
        reversed_study_list = deepcopy(study_list)
        reversed_study_list.reverse()
        for study in reversed_study_list:
            if study in study_map:
                return study_map[study]
    return {}
